<?php
/*
 $Id: portmone.php

 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com

 Copyright © 2008 osCommerce

 Released under the GNU General Public License
 */

class portmone {
  var $code, $title, $description, $enabled;

  // class constructor
  function portmone() {
    global $order;

    $this->code = 'portmone';
    $this->title = MODULE_PAYMENT_PORTMONE_TEXT_TITLE;
    $this->description = MODULE_PAYMENT_PORTMONE_TEXT_DESCRIPTION;
    $this->sort_order = MODULE_PAYMENT_PORTMONE_SORT_ORDER;
    $this->enabled = ((MODULE_PAYMENT_PORTMONE_STATUS == 'True') ? true : false);

    if ((int)MODULE_PAYMENT_PORTMONE_ORDER_STATUS_ID > 0) {
      $this->order_status = MODULE_PAYMENT_PORTMONE_ORDER_STATUS_ID;
    }

    if (is_object($order)) $this->update_status();

    if (MODULE_PAYMENT_PORTMONE_TESTMODE == 'True')
    {
      $this->form_action_url = 'https://www.portmone.com.ua/3dtest/index.php';
    }
    else
    {
      $this->form_action_url = 'https://www.portmone.com.ua/3dsecure/index.php';
    }
  }

  // class methods
  function update_status() {
    global $order;

    if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PORTMONE_ZONE > 0) ) {
      $check_flag = false;
      $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PORTMONE_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
      while ($check = tep_db_fetch_array($check_query)) {
        if ($check['zone_id'] < 1) {
          $check_flag = true;
          break;
        } elseif ($check['zone_id'] == $order->billing['zone_id']) {
          $check_flag = true;
          break;
        }
      }

      if ($check_flag == false) {
        $this->enabled = false;
      }
    }
  }

  function javascript_validation() {
    return false;
  }

  function selection() {
    return array('id' => $this->code, 
                 'module' => $this->title);
  }

  function pre_confirmation_check() {
    return false;
  }

  function confirmation() {
    return false;
  }

  function process_button() {
    global $order, $currencies, $currency, $order_id, $language;

    /*if (MODULE_PAYMENT_PORTMONE_CURRENCY == 'Selected Currency') {
     $my_currency = $currency;
     } else {
     $my_currency = substr(MODULE_PAYMENT_PORTMONE_CURRENCY, 5);
     }
     if (!in_array($my_currency, array('CAD', 'EUR', 'GBP', 'JPY', 'USD', 'UAH'))) { */
    $my_currency = 'UAH';
    //}
    /* $process_button_string = tep_draw_hidden_field('cmd', '_xclick') .
    tep_draw_hidden_field('business', MODULE_PAYMENT_PAYPAL_ID) .
    tep_draw_hidden_field('item_name', STORE_NAME) .
    tep_draw_hidden_field('amount', number_format(($order->info['total'] - $order->info['shipping_cost']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency))) .
    tep_draw_hidden_field('shipping', number_format($order->info['shipping_cost'] * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency))) .
    tep_draw_hidden_field('currency_code', $my_currency) .
    tep_draw_hidden_field('return', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')) .
    tep_draw_hidden_field('cancel_return', tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
    */
    
    if (MODULE_PAYMENT_PORTMONE_TESTMODE == 'True')
      $payee_id = '1185';
    else
      $payee_id = MODULE_PAYMENT_PORTMONE_PAYEE_ID;

    $process_button_string = tep_draw_hidden_field('PAYEE_ID', $payee_id) .
    tep_draw_hidden_field('SHOPORDERNUMBER', $order_id."".tep_create_random_value(6,'digits')) .
    tep_draw_hidden_field('BILL_AMOUNT', number_format(($order->info['total'] + $order->info['total']*0 )* $currencies->get_value($my_currency), 2, '.', '')) .
    tep_draw_hidden_field('EMAIL', $order->customer['email_address']) .
    tep_draw_hidden_field('DESCRIPTION', 'Оплата замовлення #'.$order_id) .
    tep_draw_hidden_field('SUCCESS_URL', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')) .
    tep_draw_hidden_field('FAILURE_URL', tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL')) .
    tep_draw_hidden_field('LANG', 'ru');

    return $process_button_string;
  }

  function before_process() {
    global $HTTP_POST_VARS;
    
    if (MODULE_PAYMENT_PORTMONE_TESTMODE == 'True')
    {
      $page_get = '3dtest';
      $payee_id = ' ** YOUR PAYEE ID **';
      $login = 'wdishop';
      $pass = 'wdi451';
    }
    else
    {
      $page_get = '3dsecure';
      $payee_id = MODULE_PAYMENT_PORTMONE_PAYEE_ID;
      $login = MODULE_PAYMENT_PORTMONE_PAYEE_LOG;
      $pass = MODULE_PAYMENT_PORTMONE_PAYEE_PASS;
    }

    $req = 'PAYEE_ID='.$payee_id.'&LOG='.$login.'&PASS='.$pass.'&STATUS=PAYED';

    foreach ($HTTP_POST_VARS as $key => $value) {
      $value = urlencode(stripslashes($value));
      $req.="&$key=$value";
    }

    $header = "GET /".$page_get."/result.php?".$req." HTTP/1.1\r\n";
    $header .= "Host: https://www.portmone.com.ua\r\n\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
    $header .= "Connection: close\r\n\r\n";

    $fp = @fsockopen ("ssl://www.portmone.com.ua", 443, $errno, $errstr, 30);
    if (!$fp) {
      echo "ERROR is: $errstr ($errno)<br>\n";
    } else {
      //echo "URL:".$req.":EOF<br>";
      fputs ($fp, $header);
      $res = '';
      while (!feof($fp)) {
        $res .= @fgets ($fp,1024);
      }
      @fclose ($fp);
    }
    echo $res;
    // result obtained. process result
    if (strstr($res,'<error_code>000</error_code>'))
    {
      return;
    }
    else
    {
      // error! get message
      $error_msg = substr($res, strpos($res,'<error_message>')+15,strpos($res,'</error_message>')-strpos($res,'<error_message>')-15);
      tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode($error_msg), 'SSL', true, false));
    }
    return false;
  }

  function after_process() {
    return false;
  }

  function output_error() {
    return false;
  }

  function check() {
    if (!isset($this->_check)) {
      $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PORTMONE_STATUS'");
      $this->_check = tep_db_num_rows($check_query);
    }
    return $this->_check;
  }

  function install() {
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Portmone Module', 'MODULE_PAYMENT_PORTMONE_STATUS', 'True', 'Do you want to accept Portmone payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Payee ID', 'MODULE_PAYMENT_PORTMONE_PAYEE_ID', 'your_payee_id', 'The PAYEE_ID to use for the Portmone service', '6', '4', now())");
    // tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Currency', 'MODULE_PAYMENT_PORTMONE_CURRENCY', 'Selected Currency', 'The currency to use for credit card transactions', '6', '6', 'tep_cfg_select_option(array(\'Selected Currency\',\'Only USD\',\'Only CAD\',\'Only EUR\',\'Only GBP\',\'Only JPY\',\'Only UAH\'), ', now())");
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PORTMONE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PORTMONE_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PORTMONE_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");

    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Login', 'MODULE_PAYMENT_PORTMONE_LOG', '', 'Your Portmone log-in', '6', '0', '', '', now())");
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Password', 'MODULE_PAYMENT_PORTMONE_PASS', '', 'Your Portmone password', '6', '0', '', '', now())");
    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Test mode', 'MODULE_PAYMENT_PORTMONE_TESTMODE', 'True', 'Use portmone test server?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
  }

  function remove() {
    tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
  }

  function keys() {
    // return array('MODULE_PAYMENT_PORTMONE_STATUS', 'MODULE_PAYMENT_PORTMONE_PAYEE_ID', 'MODULE_PAYMENT_PORTMONE_CURRENCY', 'MODULE_PAYMENT_PORTMONE_ZONE', 'MODULE_PAYMENT_PORTMONE_ORDER_STATUS_ID', 'MODULE_PAYMENT_PORTMONE_SORT_ORDER');
    return array('MODULE_PAYMENT_PORTMONE_STATUS', 'MODULE_PAYMENT_PORTMONE_PAYEE_ID', 'MODULE_PAYMENT_PORTMONE_ZONE', 'MODULE_PAYMENT_PORTMONE_ORDER_STATUS_ID', 'MODULE_PAYMENT_PORTMONE_SORT_ORDER','MODULE_PAYMENT_PORTMONE_LOG','MODULE_PAYMENT_PORTMONE_PASS','MODULE_PAYMENT_PORTMONE_TESTMODE');
  }
}
?>